package com.monkeyk.sos.util;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;

/**
 * 
 * 
 ***************************************************************  
 * <b>项目名称：</b>腾邦开放平台<br>
 * <b>程序名称：</b>JDBC分页助手类<br>
 * <b>日期：</b>2015年12月9日 下午3:05:10<br>
 * <b>作者：</b>Haiquan Yin<br>
 * <b>模块： </b>all<br>
 * <b>描述： </b><br>
 * <b>备注： </b><br>
 * ------------------------------------------------------------ 
 * 修改历史 
 * ------------------------------------------------------------ 
 * 序号               日期                       修改人                   修改原因 
 * ------------------------------------------------------------  
 *  
 * 修改备注： 
 * <p>@version</p>
 * <p></p>
 ***************************************************************
 */
public class PaginationHelper<E> {
	public CurrentPage<E> fetchPage(final JdbcTemplate jt,
			final String sqlCountRows, final String sqlFetchRows,
			final Object args[], final int pageNo, final int pageSize,
			final ParameterizedRowMapper<E> rowMapper) {
		// determine how many rows are available
		final int rowCount = jt.queryForInt(sqlCountRows, args);
		// calculate the number of pages
		int pageCount = rowCount / pageSize;
		if (rowCount > pageSize * pageCount) {
			pageCount++;
		}
		// create the page object
		final CurrentPage<E> page = new CurrentPage<E>();
		page.setPageNumber(pageNo);
		page.setPagesAvailable(pageCount);
		page.setTotals(rowCount);
		// fetch a single page of results
		final int startRow = (pageNo - 1) * pageSize;
		jt.query(sqlFetchRows, args, new ResultSetExtractor() {
			public Object extractData(ResultSet rs) throws SQLException,
					DataAccessException {
				final List pageItems = page.getPageItems();
				int currentRow = 0;
				while (rs.next() && currentRow < startRow + pageSize) {
					if (currentRow >= startRow) {
						pageItems.add(rowMapper.mapRow(rs, currentRow));
					}
					currentRow++;
				}
				return page;
			}
		});
		return page;
	}
	
	
	public static int findTotalCount(JdbcTemplate jt, String sqlCountRows, Object args[]) {
		int rowCount = jt.queryForInt(sqlCountRows, args);
		return rowCount;
	}
}